import os
import shutil
import re

def copy_date_named_txt(source_dir, target_dir):
    """
    将源目录下以YYYY-MM-DD.txt命名的文件复制到目标目录（包含子目录）
    """
    date_pattern = re.compile(r'^\d{4}-\d{2}-\d{2}\.txt$')
    if not os.path.exists(target_dir):
        os.makedirs(target_dir)
        print(f"目标目录不存在，已自动创建：{target_dir}")

    copied_files = []
    # 递归遍历源目录及其所有子目录
    for root, dirs, files in os.walk(source_dir):
        for filename in files:
            source_file_path = os.path.join(root, filename)
            if os.path.isfile(source_file_path) and date_pattern.match(filename):
                target_file_path = os.path.join(target_dir, filename)
                try:
                    shutil.copy2(source_file_path, target_file_path)
                    copied_files.append(f"{filename}（来自{root}）")
                    print(f"已复制：{filename}（来自{root}）")
                except Exception as e:
                    print(f"复制失败：{filename}，错误信息：{str(e)}")

    if copied_files:
        print(f"\n复制完成！共成功复制 {len(copied_files)} 个文件到目标目录：{target_dir}")
    else:
        print("\n未找到符合【YYYY-MM-DD.txt】格式的文件，无需复制。")

def get_valid_directory(prompt, is_source=False):
    """
    获取用户输入的合法目录路径
    
    :param prompt: 输入提示语
    :param is_source: 是否为源目录（源目录必须存在，目标目录可自动创建）
    :return: 合法的目录路径
    """
    while True:
        dir_path = input(prompt).strip()
        # 处理空输入（可选：直接退出或提示重新输入）
        if not dir_path:
            print("目录路径不能为空，请重新输入！")
            continue
        # 源目录必须存在，目标目录无需提前存在
        if is_source and not os.path.isdir(dir_path):
            print(f"输入的目录【{dir_path}】不存在，请重新输入！")
        else:
            return dir_path

if __name__ == "__main__":
    print("===== 日期格式TXT文件复制工具 =====")
    # 获取源目录（必须存在）
    source_dir = get_valid_directory(
        prompt="请输入待复制文件的源目录路径（绝对路径/相对路径）：",
        is_source=True
    )
    # 获取目标目录（可自动创建）
    target_dir = get_valid_directory(
        prompt="请输入文件复制的目标目录路径（绝对路径/相对路径）：",
        is_source=False
    )
    print("\n开始筛选并复制文件...\n")
    # 执行复制函数
    copy_date_named_txt(source_dir, target_dir)
    print("\n程序执行完毕！")
